package cn.itcast.utils;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
/***
 * 结果集处理的实现类
 * 得到结果集的ResultSetMetaData对象   查询数据表的值  通过反射  把值赋值给对应的实体类
 *
 */
public class BeanHandler implements ResultSetHandler {
	private Class clazz;
	public BeanHandler(Class clazz){
		this.clazz = clazz;
	}
	
	/***
	 * 通过数据表的数据  反射 把值设置到实体类中
	 */
	public Object handler(ResultSet rs) {
		try{
			if(!rs.next()){
				return null;
			}
			Object bean = clazz.newInstance();
			//ResultSetMetaData 叫元数据，是数据库 列对象，以列为单位封装为对象。
			//元数据，指的是其包含列名，列值，列类型，列长度等等有用信息。
			ResultSetMetaData metadata = rs.getMetaData();
			//返回所有字段的数目 getColumnCount()
			int columnCount = metadata.getColumnCount();  //得到结果集中有几列数据
			for(int i=0;i<columnCount;i++){
				//getColumName() 根据字段的索引值取得字段的名称   colum，字段的索引值，从1开始。
				String coulmnName = metadata.getColumnName(i+1);  //得到每列的列名      字段名称
				Object coulmnData = rs.getObject(i+1);  //得到每列的值
				
				Field f = clazz.getDeclaredField(coulmnName);//反射出类上列名对应的属性   通过属性反射来得到属性的对象
				f.setAccessible(true);
				f.set(bean, coulmnData);   //给属性设置值
			}
			return bean;
		
		
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
